/* 
 * File:   main.cpp
 * Author: dima
 *
 * Created on 14 июня 2014 г., 21:59
 *  программа запускаеться с 3 параметрами 
 *  1- левая граница промежутка "a"
 *  2- правая граница промежутка "b"
 *  3- номер примера
 *  пример№1 a.out(exe) -5 5 0
 *  пример№2 a.out(exe) 1 2 1
 */

#include <math.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
#define E 0.00001
#define Q 0.00001

double f2(double x) {
    return x * x * exp(x) - M_PI;
}

double f1(double x) {
    return 2 * x - 5;
}

double bisection(double a, double b, double (*f)(double x), bool *ok = NULL) //!< деления отрезка пополам 
{
    if (f(a) * f(b) < 0) {
        if (ok != NULL)
            *ok = true;
    } else {
        if (ok != NULL)
            *ok = false;
        return 0.;
    }
    double k, y;
    while (1) {
        k = (a + b) / 2;
        if (fabs(b - a) < 2 * E)
            return k;
        y = f(k);
        if (fabs(y) < Q)
            return k;
        f(a)*f(k) < 0 ? b = k : a = k;
    }

}

int main(int argc, char** argv) {
    if (argc != 4) {
        cout << "Количество аргументов задано неверно" << '\n';
        return 1;
    }
    double a = atof(argv[1]);
    double b = atof(argv[2]);
    int f = atoi(argv[3]) % 2;
    bool ok = false;
    switch (f) {
        case 0:
        {
            cout << "OK=" << ok << "y=" << bisection(a, b, f1, &ok) << '\n';
            break;
        }
        case 1:
        {
            cout << "OK=" << ok << "y=" << bisection(a, b, f2, &ok) << '\n';
            break;
        }
    }
    return 0;
}

